package org.example.struct.array;

/**
 * @author liyishan
 * @date 2023/8/7 09:07
 * @apiNote
 */

public class Test00665CheckPossibility {
    public static void main(String[] args) {
        int[] nums = {3,4,2,3};
        boolean flag = test1(nums);
        System.out.println(flag);

    }


    public static boolean test1(int[] nums) {
        int n = nums.length, cnt = 0;
        for (int i = 0; i < n - 1; ++i) {
            int x = nums[i], y = nums[i + 1];
            if (x > y) {
                cnt++;
                if (cnt > 1) {
                    return false;
                }
                //因为有一次的修改机会所以可以让 y = x 保证非递减
                if (i > 0 && y < nums[i - 1]) {
                    nums[i + 1] = x;
                }
            }
        }
        return true;
    }

    public static boolean test(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n - 1; ++i) {
            int x = nums[i], y = nums[i + 1];
            if (x > y) {
                nums[i] = y;
                if (isSorted(nums)) {
                    return true;
                }
                nums[i] = x; // 复原
                nums[i + 1] = x;
                return isSorted(nums);
            }
        }
        return true;
    }


    public static boolean isSorted(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < nums[i - 1]) {
                return false;
            }
        }
        return true;
    }

    /**
     * 如果是第一个  则修改第一个的值为第二个的值以确保非递减
     * 如果不是第一个  2  4  3  且当前值的前一个和后一个是非递减的   则修改当前值为前一个值
     *              3  4  2  且当前值的前一个和后一个是递减的   则修改当前值的后一个值为当前值
     * @param nums
     * @return
     */
    public static boolean test2(int[] nums){
        int i, len = nums.length, cnt = 0;
        for (i = 0; i < len - 1; ++i) {
            //递减
            if (nums[i] > nums[i + 1]) {
                cnt++;
                if (i == 0) {
                    //不能变第二个 eg：2 1 1
                    nums[i] = nums[i + 1];
                } else {
                    if (nums[i + 1] >= nums[i - 1]) {
                        //eg:2 4 3 -> 2 2 3
                        nums[i] = nums[i - 1];
                    } else {
                        //eg:3 4 2 -> 3 4 4
                        nums[i + 1] = nums[i];
                    }
                }
            }
        }
        return cnt < 2;
    }



}
